package pl.egraveyard.controller;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.BooleanUtils;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.userdetails.User;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import pl.egraveyard.assembler.OsobaAssembler;
import pl.egraveyard.bo.UzytkownikBO;
import pl.egraveyard.command.MyAccountCommand;
import pl.egraveyard.dao.SlMiejscowoscDao;
import pl.egraveyard.domain.SlMiejscowosc;
import pl.egraveyard.security.Role;
import pl.egraveyard.util.Constants;
import pl.egraveyard.util.Option;

/**
 * Kontroler dla widoku Moje konto
 * @author gunos
 *
 */
public class MyAccountController extends SimpleFormController{
	private UzytkownikBO uzytkownikBO;
	private SlMiejscowoscDao slMiejscowoscDao;
	private OsobaAssembler uzytkownikAssembler;
	

	/**
	 * @param uzytkownikBO the uzytkownikBO to set
	 */
	public void setUzytkownikBO(UzytkownikBO uzytkownikBO) {
		this.uzytkownikBO = uzytkownikBO;
	}

	/**
	 * @param slMiejscowoscDao the slMiejscowoscDao to set
	 */
	public void setSlMiejscowoscDao(SlMiejscowoscDao slMiejscowoscDao) {
		this.slMiejscowoscDao = slMiejscowoscDao;
	}

	/**
	 * @param uzytkownikAssembler the uzytkownikAssembler to set
	 */
	public void setUzytkownikAssembler(OsobaAssembler uzytkownikAssembler) {
		this.uzytkownikAssembler = uzytkownikAssembler;
	}

	/**
	 * Domyslny konstruktor
	 */
	public MyAccountController(){
		this.setCommandClass(MyAccountCommand.class);
		this.setCommandName(Constants.CMD_OBJ);
		this.setFormView("/my_account");
		this.setSuccessView("/main_page");
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Map<String, Object> referenceData(HttpServletRequest request, Object command,
			Errors errors) throws Exception {
		Map<String, Object> params = new HashMap<String, Object>();
		List<SlMiejscowosc> miejscowosci = slMiejscowoscDao.readAll();
		List<Option> miejscowosciOptions = new LinkedList<Option>();
		for(SlMiejscowosc miejscowosc : miejscowosci){
			miejscowosciOptions.add(new Option(miejscowosc.getNazwa(), miejscowosc.getKod()));
		}
		params.put(Constants.MIEJSCOWOSCI_REQ_PARAM, miejscowosciOptions);
		return params;
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		MyAccountCommand cmd = (MyAccountCommand) command;
		if(BooleanUtils.isTrue(cmd.getIsUser())){
			uzytkownikBO.updateUser(uzytkownikAssembler.convertCmd2User(cmd));
		} else {
			uzytkownikBO.updatCustomer(uzytkownikAssembler.convertCmd2Customer(cmd));
		}
		return super.onSubmit(request, response, command, errors);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Object formBackingObject(HttpServletRequest request)
			throws Exception {
		MyAccountCommand cmd = (MyAccountCommand) super.formBackingObject(request);
		User userCreditenials = (User) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal();
		cmd.setIsUser(Boolean.FALSE);
		for (GrantedAuthority grantedAuthority : userCreditenials
				.getAuthorities()) {
			if (Role.ROLE_USER.getValue().equals(grantedAuthority.getAuthority())) {
				cmd.setIsUser(Boolean.TRUE);
			}
		}
		if (BooleanUtils.isTrue(cmd.getIsUser())) {
			uzytkownikAssembler.convertUser2Cmd(
					uzytkownikBO.readUser(userCreditenials.getUsername()), cmd);
		} else {
			uzytkownikAssembler.convertCustomer2Cmd(
					uzytkownikBO.readCustomer(userCreditenials.getUsername()),
					cmd);
		}
		return cmd;
	}
}
